package ar.com.larreta.procesos;

import java.util.HashMap;
import java.util.Map;

import ar.com.larreta.comunes.Objeto;
import ar.com.larreta.excepciones.Excepcion;
import ar.com.larreta.intercambio.client.Pedido;
import ar.com.larreta.intercambio.client.Respuesta;

public class Proceso extends Objeto{
	
	public static final String PASO = "paso";
	public static final String ENTRADA = "entrada";
	public static final String NOMBRE = "nombre";
	
	private String nombre;
	
	private Map pasos = new HashMap();
	
	private Pedido pedido;
	
	protected Map<Object, Respuesta> respuestas = new HashMap<Object, Respuesta>();
	
	private Paso pasoAnterior = null;

	public Map<Object, Respuesta> getRespuestas() {
		return respuestas;
	}

	public void setRespuestas(Map<Object, Respuesta> respuestas) {
		this.respuestas = respuestas;
	}
	
	public Map getPasos() {
		return pasos;
	}

	public void setPasos(Map pasos) {
		this.pasos = pasos;
	}
	
	public void ejecutar(Pedido pedidoOriginal) throws Excepcion{
		
		logger.debug("Inicio de la ejecucion del proceso:" + nombre);
		
		pedido = pedidoOriginal;
				
		if (pasos!=null){
			logger.debug("Determinando pasos a ejecutar por el proceso:" + nombre);
			Integer ejecutados = 0;
			Integer indice = 1;
			while (Boolean.TRUE){
				logger.debug("Obteniendo Paso #" + indice + ", del prodceso:" + nombre);
				Paso paso = (Paso) pasos.get(indice.toString());
				if (paso==null){
					logger.debug("No existe Paso #" + indice + ", del prodceso:" + nombre);
					break;
				}
				paso.setProceso(this);
				paso.setPasoAnterior(pasoAnterior);
				
				logger.debug("Ejecutando Paso #" + indice + ", del prodceso:" + nombre);
				paso.ejecutar();
				
				pasoAnterior = paso;
				logger.debug("Fin de ejecucion Paso #" + indice + ", del prodceso:" + nombre);
				
				ejecutados++;
				indice++;
			}
			if (pasos.keySet().size() > ejecutados){
				//FIXME: Lanzar excepcion ya que no deberian quedar pasos sin ejecutar
				// Probablemente no tengan correlacion los numeros de paso declarado en el proceso
			}
			
			logger.debug("Finalizando la ejecucion del proceso:" + nombre);
		}
	}
	
	public void agregar(Integer indice, Paso paso){
		if (pasos!=null){
			pasos.put(indice, paso);
		}
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public Pedido getPedido() {
		return pedido;
	}
	
}
